/**
 * @file dblivre.c
 * @brief Fichier source du module database.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

/* *********************************************************************

                       Librairies de database

********************************************************************* */

#include "dblivre.h"

/* *********************************************************************

                        Fonctions

********************************************************************* */

void recuperation_DLiv(Oeuvre *oeuvre, const int id)
{
  if(oeuvre)
    {
      DataBase data;
      ouvrir_Db();

      if(id == 0)
	{
	  /* Récupération de ceux qui n'ont pas de pere */
	  prepare_Db(&data, "select rowid, volume, nbCollection, taille, nbPage, isbn, resume, illustration from livre where rowid not in (select rowid from livre)");
	}
      else
	{
	  /* Récupération de ceux qui ont comme pere id */
	  prepare_Db(&data, "select rowid, volume, nbCollection, taille, nbPage, isbn, resume, illustration from livre where rowid = ?");
	  bindValueInt_Db(&data, 1, id);
	}

      if(execute_Db(&data))
	{
	  Livre liv;
	  init_Liv(&liv);
	  setId_Liv(&liv, getValueInt_Db(&data, 0));
	  setVolume_Liv(&liv, getValueInt_Db(&data, 1));
	  setNumCollection_Liv(&liv, getValueInt_Db(&data, 2));
	  setTaille_Liv(&liv, getValueInt_Db(&data, 3));
	  setNbPage_Liv(&liv, getValueInt_Db(&data, 4));
	  setIsbn_Liv(&liv, getValueText_Db(&data, 5));
	  setResume_Liv(&liv, getValueText_Db(&data, 6));
	  setIllustration_Liv(&liv, getValueInt_Db(&data, 7));
	  setMedia_Oeu(oeuvre, &liv, copier_Liv);
	  liberer_Liv(&liv);
	}
      finalise_Db(&data);
    }
}

void insertion_DLiv(Livre *livre, const int forUpdate)
{
  if(livre)
    {
      DataBase data;
      ouvrir_Db();
      if(getSup_Liv(livre) == 1)
	{
	  suppression_DLiv(getId_Liv(livre));
	  return;
	}
      if(!forUpdate)
	{
	  prepare_Db(&data, "insert into livre (volume, nbCollection, taille, nbPage, isbn, resume, illustration, ID_Collection, ID_TypeEdition, rowid) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
	}
      else
	{
	  if(getMaj_Liv(livre) == 1)
	    {
	      prepare_Db(&data, "update livre set volume = ?, nbCollection = ?, taille = ?, nbPage = ?, isbn = ?, resume = ?, illustration = ?, ID_Collection = ?, id_typeedition = ? where rowid = ?");
	    }
	}
      if(getMaj_Liv(livre) == 1 || !forUpdate)
	{
	  bindValueInt_Db(&data, 1, getVolume_Liv(livre));
	  bindValueInt_Db(&data, 2, getNumCollection_Liv(livre));
	  bindValueInt_Db(&data, 3, getTaille_Liv(livre));
	  bindValueInt_Db(&data, 4, getNbPage_Liv(livre));
	  bindValueText_Db(&data, 5, getIsbn_Liv(livre));
	  bindValueText_Db(&data, 6, getResume_Liv(livre));
	  bindValueInt_Db(&data, 7, getIllustration_Liv(livre));
	  insertion_DCol(getPCollection_Liv(livre));
	  bindValueInt_Db(&data, 8, getId_Col(getPCollection_Liv(livre)));
	  insertion_DTyp(getPEdition_Liv(livre));
	  bindValueInt_Db(&data,9, getId_Typ(getPEdition_Liv(livre)));
	  bindValueInt_Db(&data, 10, getId_Liv(livre));
	  if(execute_Db(&data))
	    {

	    }
	  finalise_Db(&data);
	}
    }
}

void suppression_DLiv(const int id)
{
  if(id)
    {
      DataBase data;
      ouvrir_Db();
      prepare_Db(&data, "delete from Livre where rowid = ?");
      bindValueInt_Db(&data, 1, id);
      if (execute_Db(&data))
        {
	  
        }
      finalise_Db(&data);
    }
}

void regression_DLiv()
{
  Livre * livre;
  Collection *collection;
  TypeEdition *type;

  livre = creer_Liv();

  setId_Liv(livre, 1);
  setVolume_Liv(livre, 1);
  setNumCollection_Liv(livre, 1);
  setTaille_Liv(livre, 99);
  setNbPage_Liv(livre, 455);
  setIsbn_Liv(livre, "dsqFLMqfj");
  setResume_Liv(livre, "Resume de livre");
  setIllustration_Liv(livre, 1);

  collection = creer_Col();
  setLibelle_Col(collection, "Collection de test");
  setPCollection_Liv(livre, collection);
  detruire_Col(&collection);
  type = creer_Typ();
  setLibelle_Typ(type, "Type Edition de test");
  setPEdition_Liv(livre, type);
  detruire_Typ(&type);

  insertion_DLiv(livre, 0);

  detruire_Liv(&livre);
  fermer_Db();
}
